util 模块是一个工具模块,提供了一些常用的辅助函数。
下面将逐介绍一下常用的方法。
util.inspect(object, [options])
,常与 console.log
搭配使用,可以友好的将对象转为字符串,打印更加友好。
下面是一个用于测试的对象。
js
// 复杂对象
const testObj = {
a: 1,
b: {
c: 2,
d: [3, 4, 5],
e: () => {
console.log(6)
}
},
f: '7',
g: [{ 8: [{ 9: 10 }] }],
h() {
console.log(11)
}
}
首先是普通打印,可以看到嵌套的数组和函数没有办法打印出来,
js
console.log(testObj)
然后是通过 JSON.stringify
。
js
console.log(JSON.stringify(testObj, null, 2))
可以看到函数没有了,
最后是 util.inspect
,其中 depth
用于控制展开的层级。
js
console.log(util.inspect(testObj, { depth: Math.Infinity }))
可以看到深层的数组和对象被展开了。
当然实际开发中可以使用 javascript-stringify 这个库,来实现更佳完整友好的转换。
```sh
npm i javascript-stringify ```
运行结果如下。
```js import { stringify } from 'javascript-stringify'
console.log(stringify(testObj, null, 2)) ```
能保持和传入的结果基本一致。
util.format(format[, ...args]) 类似于 C 语言中的使用 printf
方法的传参,
该方法支持占位符 (%s、%d、%j 等) 来表示不同类型的变量,支持传入多个参数。
```js import util from 'util'
console.log(util.format('%s:%s', 'foo', 'bar')) // 'foo:bar' console.log(util.format('%d + %d = %d', 1, 2, 3)) // '1 + 2 = 3'
console.log( util.format('My name is %j', { firstName: 'John', lastName: 'Doe' }) ) // 'My name is {"firstName":"John","lastName":"Doe"}' ```
util.callbackify
可以将一个返回 promise
的函数转为回调形式的函数。
```js import util from 'util'
function foo() { return Promise.resolve('hello world') }
function bar() { return Promise.reject(new Error('error reject')) }
const callbackFoo = util.callbackify(foo) const callbackBar = util.callbackify(bar)
callbackFoo((err, ret) => { if (err) { console.log('err', err) return } console.log(ret) })
callbackBar((err, ret) => { if (err) { console.log('err', err) return } console.log(ret) }) ```
util.promisify(original)
用于将常规带有回调函数的方法转为返回 Promise 对象的方法。
以 fs.readFile
举例。
js
// 引入 Node.js 内置模块 util 和 fs
import util from 'util'
import fs from 'fs'
// 将 fs.readFile 方法转换为返回 Promise 的函数
const fsRead = util.promisify(fs.readFile)
// 使用 Promise 的方式读取文件内容并输出
fsRead('./package.json').then((data) => {
console.log(data.toString())
})
当然这些方法编辑器会显示已经弃用 (deprecated,即表示有其它可替代的方法了),当然也不妨碍了解一下。
```js import util from 'util'
// 判断数据类型 console.log(util.isArray([])) // true console.log(util.isRegExp(/some regexp/)) // true console.log(util.isDate(new Date())) // true console.log(util.isPrimitive(null)) // true console.log(util.isPrimitive(1)) // true ```
本节介绍了 util
模块的常用方法,包括,
对象转字符串 (inspect
)、格式化字符串 (format
)、promise 转回调 (callbackify
)、回调转 promise (promisify
)、判断数据类型等方法。
熟练利用这些方法,可以避免自己重复书写同样的工具方法,提高编码效率。